b8b94d7e46b5ad77b5b7226e49aaf22e8d3973ed,src/org/lwjgl/demo/vulkan/InstancedSpheresDemo.java,InstancedSpheresDemo,imageBarrier,#VkCommandBuffer#number#number#number#number#,449

Before Change



    private static void imageBarrier(VkCommandBuffer cmdbuffer, long image, int aspectMask, int oldImageLayout, int newImageLayout) {
        // Create an image barrier object
        VkImageMemoryBarrier.Buffer imageMemoryBarrier = VkImageMemoryBarrier.calloc(1)
                .sType(VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER)
                .pNext(NULL)
                .oldLayout(oldImageLayout)
                .newLayout(newImageLayout)
                .srcQueueFamilyIndex(VK_QUEUE_FAMILY_IGNORED)
                .dstQueueFamilyIndex(VK_QUEUE_FAMILY_IGNORED)
                .image(image);
        imageMemoryBarrier.subresourceRange()
                .aspectMask(aspectMask)
                .baseMipLevel(0)
                .levelCount(1)
                .layerCount(1);

        // Source layouts (old)

        // Undefined layout
        // Only allowed as initial layout!
        // Make sure any writes to the image have been finished
        if (oldImageLayout == VK_IMAGE_LAYOUT_UNDEFINED) {
            //imageMemoryBarrier.srcAccessMask(VK_ACCESS_HOST_WRITE_BIT | VK_ACCESS_TRANSFER_WRITE_BIT);
            imageMemoryBarrier.srcAccessMask(0);// <- validation layer tells that this must be 0
        }

        // Old layout is color attachment
        // Make sure any writes to the color buffer have been finished
        if (oldImageLayout == VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL) {
            imageMemoryBarrier.srcAccessMask(VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT);
        }

        // Old layout is transfer source
        // Make sure any reads from the image have been finished
        if (oldImageLayout == VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL) {
            imageMemoryBarrier.srcAccessMask(VK_ACCESS_TRANSFER_READ_BIT);
        }

        // Old layout is shader read (sampler, input attachment)
        // Make sure any shader reads from the image have been finished
        if (oldImageLayout == VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL) {
            imageMemoryBarrier.srcAccessMask(VK_ACCESS_SHADER_READ_BIT);
        }

        // Target layouts (new)

        // New layout is transfer destination (copy, blit)
        // Make sure any copyies to the image have been finished
        if (newImageLayout == VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL) {
            imageMemoryBarrier.dstAccessMask(VK_ACCESS_TRANSFER_WRITE_BIT);
        }

        // New layout is transfer source (copy, blit)
        // Make sure any reads from and writes to the image have been finished
        if (newImageLayout == VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL) {
            imageMemoryBarrier.srcAccessMask(imageMemoryBarrier.srcAccessMask() | VK_ACCESS_TRANSFER_READ_BIT);
            imageMemoryBarrier.dstAccessMask(VK_ACCESS_TRANSFER_READ_BIT);
        }

        // New layout is color attachment
        // Make sure any writes to the color buffer hav been finished
        if (newImageLayout == VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL) {
            imageMemoryBarrier.dstAccessMask(VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT);
            imageMemoryBarrier.srcAccessMask(VK_ACCESS_TRANSFER_READ_BIT);
        }

        // New layout is depth attachment
        // Make sure any writes to depth/stencil buffer have been finished
        if (newImageLayout == VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL) {
            imageMemoryBarrier.dstAccessMask(imageMemoryBarrier.dstAccessMask() | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT);
        }

        // New layout is shader read (sampler, input attachment)
        // Make sure any writes to the image have been finished
        if (newImageLayout == VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL) {
            imageMemoryBarrier.srcAccessMask(VK_ACCESS_HOST_WRITE_BIT | VK_ACCESS_TRANSFER_WRITE_BIT);
            imageMemoryBarrier.dstAccessMask(VK_ACCESS_SHADER_READ_BIT);
        }

After Change


        VkImageMemoryBarrier.Buffer imageMemoryBarrier = VkImageMemoryBarrier.calloc(1)
                .sType(VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER)
                .pNext(NULL)
                .oldLayout(oldImageLayout)
                .srcAccessMask(srcAccess)
                .newLayout(newImageLayout)
                .dstAccessMask(dstAccess)
                .srcQueueFamilyIndex(VK_QUEUE_FAMILY_IGNORED)
                .dstQueueFamilyIndex(VK_QUEUE_FAMILY_IGNORED)
                .image(image);
        imageMemoryBarrier.subresourceRange()